﻿using System;
using System.Linq;
using System.Windows.Forms;
using AcessaDados = AcessaDadosBD;
using AcessaDadosBD.Repositorios;
using docTissV2.Classes;
using docTissV2.Classes.TreeNodeContents;
using docTissV2.Enumeradores;
using System.Collections.Generic;
using System.IO;

namespace docTissV2
{
    public partial class uc_GerenciaGuia : UserControl
    {
        #region Construtor
        public uc_GerenciaGuia()
        {
            InitializeComponent();
        }
        #endregion

        #region Eventos
        private void uc_GerenciaGuia_Load(object sender, EventArgs e)
        {
            treAcompanhaGuia.Nodes.Clear();

            //Retorna TODAS as operadoras Filiadas ao Prestador
            var operadoraPrestadorRepository = new OperadoraPrestadorRepository(AddinUtils.Command);
            var operadoraRepository = new OperadoraRepository(AddinUtils.Command);

            var operadorasFiliadas = from operadoraPrestador in operadoraPrestadorRepository.GetAll()
                                     join operadora in operadoraRepository.GetAll() on
                                         operadoraPrestador.RegistroANS equals operadora.RegistroANS
                                     where operadoraPrestador.IDPrestador == AddinUtils.UsuarioID
                                     select new 
                                     {
                                        operadora.Logo,
                                        operadora.Nome,
                                        operadora.RegistroANS,
                                        operadoraPrestador.CodigoNaOperadora,
                                        operadoraPrestador.ID
                                     };
                                        

            //Existe alguma operadora?
            if (operadorasFiliadas.Count() > 0)
            {
                foreach (var item in operadorasFiliadas)
                {
                    IdentificacaoPrestadorNaOperadora identificacao = IdentificacaoPrestadorNaOperadora.CodigoPrestadorNaOperadora;

                    string codigoNaOperadora = item.CodigoNaOperadora;

                    if (codigoNaOperadora == string.Empty)
                    {
                        if (AddinUtils.TipoPrestador.Value == TipoPrestador.Profissional)
                            identificacao = IdentificacaoPrestadorNaOperadora.CPF;
                        else
                            identificacao = IdentificacaoPrestadorNaOperadora.CNPJ;
                        codigoNaOperadora = AddinUtils.CPF_CNPJ;
                    }
                    
                    //Cria Nó da Operadora
                    TreeNode noOperadora = this.CriarNoOperadora(item.Nome, item.RegistroANS, item.ID, identificacao, codigoNaOperadora, item.Logo);
                    
                    for (int tipoGuia = (int)Enumeradores.TipoGuia.Consulta; 
                        tipoGuia <= (int)Enumeradores.TipoGuia.Solicitação_Odontologia; tipoGuia++)
                    {
                        //Cria Nó de Tipo de Guia
                        noOperadora.Nodes.Add(CriarNoTipoGuia((ConteudoNoOperadora)noOperadora.Tag, (Enumeradores.TipoGuia)tipoGuia));
                    }
                    treAcompanhaGuia.Nodes.Add(noOperadora);
                }
            }
        }

        private void treAcompanhaGuia_AfterCollapse(object sender, TreeViewEventArgs e)
        {

        }

        private void treAcompanhaGuia_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            treAcompanhaGuia.SelectedNode = e.Node;

            switch (((TreeNodeContent)treAcompanhaGuia.SelectedNode.Tag).TipoNo)
            {
                case docTissV2.Enumeradores.TipoNo.TipoGuia:
                    if (!((ConteudoNoTipoGuia)treAcompanhaGuia.SelectedNode.Tag).IsLoad)
                    {
                        ((ConteudoNoTipoGuia)treAcompanhaGuia.SelectedNode.Tag).IsLoad = true;
                        treAcompanhaGuia.SelectedNode.Nodes.Clear();
                        if (((ConteudoNoTipoGuia)treAcompanhaGuia.SelectedNode.Tag).TipoGuia < TipoGuia.Solicitação_Internação)
                            treAcompanhaGuia.SelectedNode.Nodes.AddRange(CriarListaNoLote((ConteudoNoTipoGuia)treAcompanhaGuia.SelectedNode.Tag));
                        else
                            treAcompanhaGuia.SelectedNode.Nodes.AddRange(CriarListaNoGuiaSolicitacao((ConteudoNoTipoGuia)treAcompanhaGuia.SelectedNode.Tag));
                    }
                        break;
                case docTissV2.Enumeradores.TipoNo.Lote:
                    if (!((ConteudoNoLote)treAcompanhaGuia.SelectedNode.Tag).IsLoad)
                    {
                        ((ConteudoNoLote)treAcompanhaGuia.SelectedNode.Tag).IsLoad = true;
                        treAcompanhaGuia.SelectedNode.Nodes.Clear();
                        treAcompanhaGuia.SelectedNode.Nodes.AddRange(CriarListaNoGuiaFaturamento((ConteudoNoLote)treAcompanhaGuia.SelectedNode.Tag));
                    }
                        break;
                case docTissV2.Enumeradores.TipoNo.GuiaFaturamento:
                        if (!((ConteudoNoGuia)treAcompanhaGuia.SelectedNode.Tag).IsLoad)
                        {
                            treAcompanhaGuia.SelectedNode.Nodes.Clear();
                            //TODO: Carregar Guia Outras Despesas
                            //((ConteudoNoGuia)treAcompanhaGuia.SelectedNode.Tag).Load();
                        }
                    break;
                case docTissV2.Enumeradores.TipoNo.GuiaSolicitacao:
                    if (!((ConteudoNoGuia)treAcompanhaGuia.SelectedNode.Tag).IsLoad)
                    {
                        treAcompanhaGuia.SelectedNode.Nodes.Clear();
                        //TODO: Carregar Guia Extensao
                        //((ConteudoNoGuia)treAcompanhaGuia.SelectedNode.Tag).Load();
                    }
                    break;
            }
        }

        private void treAcompanhaGuia_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            treAcompanhaGuia.SelectedNode = e.Node;
        }

        private void treAcompanhaGuia_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (((TreeNodeContent)treAcompanhaGuia.SelectedNode.Tag).TipoNo == TipoNo.GuiaFaturamento ||
                ((TreeNodeContent)treAcompanhaGuia.SelectedNode.Tag).TipoNo == TipoNo.GuiaSolicitacao ||
                ((TreeNodeContent)treAcompanhaGuia.SelectedNode.Tag).TipoNo == TipoNo.GuiaExtensao)
                AddinUtils.AbrirGuia(((ConteudoNoGuia)treAcompanhaGuia.SelectedNode.Tag).Path);
        }

        #region ContextMenuStrip
        
        #region TipoGuia
        private void CriarLoteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            IntervaloLoteRepository repositorioIntervaloLote = new IntervaloLoteRepository(AddinUtils.Command);

            var colecaoIntervaloLote = from i in repositorioIntervaloLote.GetAll()
                                where i.IDOperadoraPrestador.Equals(((ConteudoNoTipoGuia)treAcompanhaGuia.SelectedNode.Tag).NoOperadora.IDOperadoraPrestador)
                                select i;

            AcessaDados.IntervaloLote intervaloLote = null;

            //Verifica se existe um intervalo de lote
            if (colecaoIntervaloLote.Count() > 0)
            {
                foreach (var item in colecaoIntervaloLote)
                {
                    //Verifica se o intervalo encontrado é válido
                    if (item.Atual < item.Fim)
                    {
                        intervaloLote = item;
                        break;
                    }
                }

                if (intervaloLote != null)
                {
                    LoteGuiaRepository repositorioLoteGuia = new LoteGuiaRepository(AddinUtils.Command);

                    AcessaDados.LoteGuia novoLote = new AcessaDados.LoteGuia()
                    {
                        IDOperadoraPrestador = ((ConteudoNoTipoGuia)treAcompanhaGuia.SelectedNode.Tag).NoOperadora.IDOperadoraPrestador,
                        NumeroLote = (++intervaloLote.Atual).ToString(),
                        TipoGuia = (AcessaDados.TipoGuia)((int)((ConteudoNoTipoGuia)treAcompanhaGuia.SelectedNode.Tag).TipoGuia)
                    };

                    //Insere lote no bd e retorna o id
                    AcessaDados.LoteGuia lote = repositorioLoteGuia.GetById(repositorioLoteGuia.Insert(novoLote));

                    //Atualiza Intervalo Lote
                    repositorioIntervaloLote.Update(intervaloLote);

                    //Insere novo Lote no TreeView
                    treAcompanhaGuia.SelectedNode.Nodes.Add(CriarNoLote((ConteudoNoTipoGuia)treAcompanhaGuia.SelectedNode.Tag, lote.NumeroLote, lote.ID));
                    treAcompanhaGuia.SelectedNode.Expand();
                }
                else
                {
                    MessageBox.Show(" O intervalo de lotes cadastrados para esta Operadora está esgotado!\nPor favor, cadastre um novo intervalo no menu Configuração.");
                }
            }
            else
            {
                MessageBox.Show("Não existe intervalo de lotes cadastrado para esta operadora!");
            }         
        }
        #endregion

        #region Lotes
        private void importarGuiaToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

        private void gerarXMLGuiaFaturamentoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (fbdGerarXML.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    treAcompanhaGuia.SelectedNode.Expand();
                    //Lista de guias, cada item da lista é composto pela guia principal e suas extensões
                    List<string[]> guiasPath = new List<string[]>();
                    foreach (TreeNode node in treAcompanhaGuia.SelectedNode.Nodes)
                    {
                        //Vetor com a guia principal e suas extensões
                        string[] guiaPath = new string[(1 + node.Nodes.Count)]; //Guia + extensões

                        guiaPath[0] = ((ConteudoNoGuia)node.Tag).Path; //Guia principal

                        node.Expand();

                        //Verifica se possui extensões
                        if (node.Nodes.Count > 0)
                        {
                            int indiceGuiaExtensao = 1; //Indice da primeira guia de extensão no vetor
                            foreach (TreeNode nodeOutrasDespesas in node.Nodes)
                            {
                                guiaPath[indiceGuiaExtensao++] = ((ConteudoNoGuiaExtensao)nodeOutrasDespesas.Tag).Path;
                            }
                        }
                        guiasPath.Add(guiaPath);

                        //Fecha o documento para não haver conflito de acesso ao arquivo
                        AddinUtils.FecharGuia(guiaPath[0]);
                    }

                    if (((TreeNodeContent)treAcompanhaGuia.SelectedNode.Tag).TipoNo == TipoNo.Lote)
                    {
                        MensagemTISS.CriaMensagemTISSGuiaFaturamento(((ConteudoNoLote)treAcompanhaGuia.SelectedNode.Tag).NoTipoGuia,
                            ((ConteudoNoLote)treAcompanhaGuia.SelectedNode.Tag).NumeroLote,
                            guiasPath, fbdGerarXML.SelectedPath);
                    }
                    else if (((TreeNodeContent)treAcompanhaGuia.SelectedNode.Tag).TipoNo == TipoNo.GuiaSolicitacao)
                        MensagemTISS.CriaMensagemTISSGuiaSolicitacao();

                    MessageBox.Show("Mensagem XML gerada com sucesso!", "Sucesso!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                }
                catch (Exception err)
                {
                    MessageBox.Show("Erro ao gerar XML do Lote de Guias!\n" + err.Message, "Erro no XML!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                }
            }
        }
        #endregion

        #region Criar Guia

        private void CriarGuiaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string dateTimeNow = DateTime.Now.ToString("dd_MM_yyyy_hh_mm_ss");
            ConteudoNoGuia novoConteudoNoGuia = ((TreeNodeContent)treAcompanhaGuia.SelectedNode.Tag).TipoNo.Equals(TipoNo.Lote) ?
                new ConteudoNoGuia(((ConteudoNoLote)treAcompanhaGuia.SelectedNode.Tag).NoOperadora, ((ConteudoNoLote)treAcompanhaGuia.SelectedNode.Tag).NoTipoGuia,
                            (ConteudoNoLote)treAcompanhaGuia.SelectedNode.Tag, string.Empty, sfdGuia.FileName, dateTimeNow) :
                        new ConteudoNoGuia(((ConteudoNoTipoGuia)treAcompanhaGuia.SelectedNode.Tag).NoOperadora,
                            (ConteudoNoTipoGuia)treAcompanhaGuia.SelectedNode.Tag, string.Empty, sfdGuia.FileName, dateTimeNow);

            sfdGuia.FileName = "guia" + novoConteudoNoGuia.NoTipoGuia.TipoGuia.ToString() + DateTime.Now.ToString("dd_MM_yyyy_hh_mm_ss");
            if (novoConteudoNoGuia.TipoNo.Equals(TipoNo.GuiaFaturamento) && treAcompanhaGuia.SelectedNode.Nodes.Count >= 100)
            {
                MessageBox.Show("Este lote está com o limite de 100 guias!");
                return;
            }
            if (sfdGuia.ShowDialog() == DialogResult.OK)
            {
                novoConteudoNoGuia.Path = sfdGuia.FileName;
                string templatePath = string.Empty;
                switch (novoConteudoNoGuia.NoTipoGuia.TipoGuia)
                {
                    case TipoGuia.Consulta:
                        templatePath = AppDomain.CurrentDomain.BaseDirectory + "\\templates\\guiaConsulta.docx";
                        break;
                    case TipoGuia.SP_SADT:
                        templatePath = AppDomain.CurrentDomain.BaseDirectory + "\\templates\\guiaSP_SADT.docx";
                        break;
                    case TipoGuia.Resumo_Internação:
                        templatePath = AppDomain.CurrentDomain.BaseDirectory + "\\templates\\guiaResumoInternacao.docx";
                        break;
                    case TipoGuia.Honorário_Individual:
                        templatePath = AppDomain.CurrentDomain.BaseDirectory + "\\templates\\guiaHonorarioIndividual.docx";
                        break;
                    case TipoGuia.Odontologia:
                        templatePath = AppDomain.CurrentDomain.BaseDirectory + "\\templates\\guiaOdontologia.docx";
                        break;
                    case TipoGuia.Consulta_Reapresentação:
                        templatePath = AppDomain.CurrentDomain.BaseDirectory + "\\templates\\guiaConsultaReapresentacao.docx";
                        break;
                    case TipoGuia.SP_SADT_Reapresentação:
                        templatePath = AppDomain.CurrentDomain.BaseDirectory + "\\templates\\guiaConsultaReapresentacao.docx";
                        break;
                    case TipoGuia.Resumo_Internação_Reapresentação:
                        templatePath = AppDomain.CurrentDomain.BaseDirectory + "\\templates\\guiaSP_SADTReapresentacao.docx";
                        break;
                    case TipoGuia.Honorário_Individual_Reapresentação:
                        templatePath = AppDomain.CurrentDomain.BaseDirectory + "\\templates\\guiaHonorarioIndividualReapresentacao.docx";
                        break;
                    case TipoGuia.Odontologia_Reapresentação:
                        templatePath = AppDomain.CurrentDomain.BaseDirectory + "\\templates\\guiaOdontologiaReapresentacao.docx";
                        break;
                    case TipoGuia.Solicitação_Internação:
                        templatePath = AppDomain.CurrentDomain.BaseDirectory + "\\templates\\guiaSolicitacaoInternacao.docx";
                        break;
                    case TipoGuia.Solicitação_Prorrogação:
                        templatePath = AppDomain.CurrentDomain.BaseDirectory + "\\templates\\guiaSolicitacaoProrrogacao.docx";
                        break;
                    case TipoGuia.Solicitação_SADT:
                        templatePath = AppDomain.CurrentDomain.BaseDirectory + "\\templates\\guiaSolicitacaoSP_SADT.docx";
                        break;
                    case TipoGuia.Solicitação_Odontologia:
                        templatePath = AppDomain.CurrentDomain.BaseDirectory + "\\templates\\guiaSolicitacaoOdonto.docx";
                        break;
                    case TipoGuia.Outras_Despesas:
                        templatePath = AppDomain.CurrentDomain.BaseDirectory + "\\templates\\guiaOutrasDespesas.docx";
                        break;
                }

                File.Copy(templatePath, sfdGuia.FileName, true);

                DadosGuia dadosGuia = new DadosGuia(novoConteudoNoGuia);
                DadosAutoPreencherGuia dadosAutoPreencherGuia = new DadosAutoPreencherGuia(dadosGuia, novoConteudoNoGuia.NoTipoGuia.TipoGuia);
                try
                {
                    if (sender.ToString() == "Executante")
                        AddinUtils.PreencheGuia(sfdGuia.FileName, dadosAutoPreencherGuia, TipoProfissional.ProfissionalExecutante);
                    else if (sender.ToString() == "Solicitante")
                        AddinUtils.PreencheGuia(sfdGuia.FileName, dadosAutoPreencherGuia, TipoProfissional.ProfissionalSolicitante);
                    else if (sender.ToString() == "Solicitante e Executante")
                        AddinUtils.PreencheGuia(sfdGuia.FileName, dadosAutoPreencherGuia, TipoProfissional.ProfissionalSolicitanteExecutante);
                }
                catch (Exception) { }

                AddinUtils.AbrirGuia(sfdGuia.FileName);

                AddinUtils.AlteraLogoGuia(dadosGuia.Logo);

                uc_NumeroGuia ucNumeroGuia = new uc_NumeroGuia(novoConteudoNoGuia);
                Globals.ThisAddIn.NumeroGuiaCTP = Globals.ThisAddIn.CustomTaskPanes.Add(ucNumeroGuia, "Número da Guia");
                Globals.ThisAddIn.NumeroGuiaCTP.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionFloating;
                Globals.ThisAddIn.NumeroGuiaCTP.Height = 118;
                Globals.ThisAddIn.NumeroGuiaCTP.Width = 180;
                Globals.ThisAddIn.NumeroGuiaCTP.Visible = true;
                Globals.ThisAddIn.NumeroGuiaCTP.Control.Focus();
                ucNumeroGuia.numeroGuiaChanged += new uc_NumeroGuia.numeroGuiaChangedHandler(this.ucNumeroGuia_numeroGuiaChanged);
                Globals.ThisAddIn.NumeroGuiaCTP.VisibleChanged += new EventHandler(NumeroGuiaCTP_VisibleChanged);
            }
        }

        private void NumeroGuiaCTP_VisibleChanged(object sender, EventArgs e)
        {
            if (!Globals.ThisAddIn.NumeroGuiaCTP.Visible)
            {
                try
                {
                    object doNotSaveChanges = Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges;
                    object mis = Globals.ThisAddIn._missing;
                    Globals.ThisAddIn.Application.ActiveDocument.Close(ref doNotSaveChanges, ref mis, ref mis);
                }
                catch (Exception)
                {

                    throw;
                }
            }
        }

        public void ucNumeroGuia_numeroGuiaChanged(object sender)
        {
            uc_NumeroGuia ucNumeroGuia = (uc_NumeroGuia)sender;

            if (ucNumeroGuia.conteudoNoGuia.NumeroGuia != string.Empty)
            {
                object numeroGuiaCC = Globals.ThisAddIn.IndexNumeroGuiaCC;

                Globals.ThisAddIn.doc.ContentControls.get_Item(ref numeroGuiaCC).Range.Text = ucNumeroGuia.conteudoNoGuia.NumeroGuia;

                if (ucNumeroGuia.conteudoNoGuia.TipoNo.Equals(TipoNo.GuiaFaturamento))
                {
                    //Insere nova guia de faturamento ou glosa no BD
                    GuiaFaturamentoRepository repositorioGuiaFaturamento = new GuiaFaturamentoRepository(AddinUtils.Command);

                    AcessaDados.GuiaFaturamento novaGuiaFaturamento = new AcessaDados.GuiaFaturamento()
                    {
                        DataEmissao = DateTime.Now.Date,
                        Glosa = false,
                        Local = ucNumeroGuia.conteudoNoGuia.Path,
                        IDLoteGuia = ucNumeroGuia.conteudoNoGuia.NoLote.LoteID,
                        NumeroGuia = ucNumeroGuia.conteudoNoGuia.NumeroGuia,
                        Reapresentada = false
                    };

                    repositorioGuiaFaturamento.Insert(novaGuiaFaturamento);

                    //Insere novo TreeNode de guia faturamento no TreeView
                    treAcompanhaGuia.SelectedNode.Nodes.Add(CriarNoGuiaFaturamento(ucNumeroGuia.conteudoNoGuia));
                    treAcompanhaGuia.SelectedNode.Expand();
                }
                else if (ucNumeroGuia.conteudoNoGuia.TipoNo.Equals(TipoNo.GuiaSolicitacao))
                {
                    //Insere nova guia de solicitação no BD
                    GuiaSolicitacaoRepository repositorioGuiaSolicitacao = new GuiaSolicitacaoRepository(AddinUtils.Command);

                    AcessaDados.GuiaSolicitacao novaGuiaSolicitacao = new AcessaDados.GuiaSolicitacao()
                    {
                        DataEmissao = DateTime.Now.Date,
                        IDOperadoraPrestador = ucNumeroGuia.conteudoNoGuia.NoOperadora.IDOperadoraPrestador,
                        IDTipoGuia = (int)ucNumeroGuia.conteudoNoGuia.NoTipoGuia.TipoGuia,
                        Local = ucNumeroGuia.conteudoNoGuia.Path,
                        NumeroGuia = ucNumeroGuia.conteudoNoGuia.NumeroGuia
                    };

                    repositorioGuiaSolicitacao.Insert(novaGuiaSolicitacao);

                    //Insere novo TreeNode de guia solicitação no TreeView
                    treAcompanhaGuia.SelectedNode.Nodes.Add(CriarNoGuiaSolicitacao(ucNumeroGuia.conteudoNoGuia));
                    treAcompanhaGuia.SelectedNode.Expand();
                }

            }
        }

        #endregion

        #region Guias
        private void abrirGuiaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            AddinUtils.AbrirGuia(((ConteudoNoGuia)treAcompanhaGuia.Tag).Path);
        }
        #endregion
        #endregion
        #endregion

        #region Métodos
        private TreeNode CriarNoOperadora(string nomeOperadora, string registroANS, int idOperadoraPrestador, IdentificacaoPrestadorNaOperadora identificacao, string codigoNaOperadora, byte[] logo)
        {
            TreeNode noOperadora = new TreeNode(nomeOperadora);
            noOperadora.Tag = new ConteudoNoOperadora(registroANS, idOperadoraPrestador, identificacao, codigoNaOperadora, logo);
            noOperadora.ImageIndex = 0;
            noOperadora.SelectedImageIndex = 0;

            return noOperadora;
        }

        private TreeNode CriarNoTipoGuia(ConteudoNoOperadora conteudoNoOperadora, Enumeradores.TipoGuia tipoGuia)
        {
            TreeNode noTipoGuia = new TreeNode(tipoGuia.ToString());
            noTipoGuia.Tag = new ConteudoNoTipoGuia(conteudoNoOperadora, tipoGuia);

            //Adiciona ContextMenuStrip
            noTipoGuia.ContextMenuStrip = GerarContextMenuStrip(TipoNo.TipoGuia, tipoGuia, null);

            if (tipoGuia <= Enumeradores.TipoGuia.Odontologia_Reapresentação)
            {
                noTipoGuia.ImageIndex = 1;
                noTipoGuia.SelectedImageIndex = 1;
            }
            else
            {
                if (tipoGuia == Enumeradores.TipoGuia.Solicitação_Internação)
                {
                    noTipoGuia.ImageIndex = 7;
                    noTipoGuia.SelectedImageIndex = 7;
                }
                if (tipoGuia == Enumeradores.TipoGuia.Solicitação_Prorrogação)
                {
                    noTipoGuia.ImageIndex = 8;
                    noTipoGuia.SelectedImageIndex = 8;
                }
                if (tipoGuia == Enumeradores.TipoGuia.Solicitação_SADT)
                {
                    noTipoGuia.ImageIndex = 9;
                    noTipoGuia.SelectedImageIndex = 9;
                }
                if (tipoGuia == Enumeradores.TipoGuia.Solicitação_Odontologia)
                {
                    noTipoGuia.ImageIndex = 10;
                    noTipoGuia.SelectedImageIndex = 10;
                }
            }
            noTipoGuia.Nodes.Add("nodeFake");

            return noTipoGuia;
        }

        private TreeNode CriarNoLote(ConteudoNoTipoGuia conteudoNoTipoGuia, string numeroLote, int loteID)
        {
            TreeNode noLote = new TreeNode(numeroLote);

            noLote.Tag = new ConteudoNoLote(conteudoNoTipoGuia.NoOperadora, conteudoNoTipoGuia, loteID, numeroLote);

            noLote.ImageIndex = 2;
            noLote.SelectedImageIndex = 2;

            noLote.ContextMenuStrip = GerarContextMenuStrip(TipoNo.Lote, conteudoNoTipoGuia.TipoGuia, null);

            noLote.Nodes.Add("nodeFake");

            return noLote;
        }

        private TreeNode[] CriarListaNoLote(ConteudoNoTipoGuia conteudoNoTipoGuia)
        {
            List<TreeNode> listaNoLote = new List<TreeNode>();

            LoteGuiaRepository repositorioLoteGuia = new LoteGuiaRepository(AddinUtils.Command);

            var colecaoLotes = from l in repositorioLoteGuia.GetAll()
                        where l.IDOperadoraPrestador == conteudoNoTipoGuia.NoOperadora.IDOperadoraPrestador &&
                                (int)l.TipoGuia == (int)conteudoNoTipoGuia.TipoGuia
                        select l;

            foreach (var lote in colecaoLotes)
            {
                listaNoLote.Add(CriarNoLote(conteudoNoTipoGuia, lote.NumeroLote, lote.ID));
            }

            return listaNoLote.ToArray();
        }

        private TreeNode CriarNoGuiaFaturamento(ConteudoNoGuia conteudoNoGuiaFaturamento)
        {
            TreeNode noGuia = new TreeNode(Path.GetFileNameWithoutExtension(conteudoNoGuiaFaturamento.Path));

            noGuia.Tag = conteudoNoGuiaFaturamento;

            noGuia.ImageIndex = 3;
            noGuia.SelectedImageIndex = 3;

            noGuia.ContextMenuStrip = GerarContextMenuStrip(TipoNo.GuiaFaturamento, conteudoNoGuiaFaturamento.NoTipoGuia.TipoGuia, false);

            if (conteudoNoGuiaFaturamento.NoTipoGuia.TipoGuia == TipoGuia.SP_SADT || 
                conteudoNoGuiaFaturamento.NoTipoGuia.TipoGuia == TipoGuia.SP_SADT_Reapresentação)
                noGuia.Nodes.Add("nodeFake");

            return noGuia;
        }

        private TreeNode[] CriarListaNoGuiaFaturamento(ConteudoNoLote conteudoNoLote)
        {
            List<TreeNode> listaNoGuiaFaturamento = new List<TreeNode>();

            GuiaFaturamentoRepository repositorioGuiaFaturamento = new GuiaFaturamentoRepository(AddinUtils.Command);

            var colecaoGuias = from g in repositorioGuiaFaturamento.GetAll()
                               where g.IDLoteGuia == conteudoNoLote.LoteID
                               select g;

            foreach (var guia in colecaoGuias)
            {
                listaNoGuiaFaturamento.Add(CriarNoGuiaFaturamento(new ConteudoNoGuia(conteudoNoLote.NoOperadora, conteudoNoLote.NoTipoGuia, conteudoNoLote, guia.NumeroGuia, guia.Local, guia.DataEmissao.ToString("dd/MM/yyyy"))));
            }

            return listaNoGuiaFaturamento.ToArray();
        }

        private TreeNode CriarNoGuiaSolicitacao(ConteudoNoGuia conteudoNoGuiaSolicitacao)
        {
            TreeNode noGuia = new TreeNode(Path.GetFileNameWithoutExtension(conteudoNoGuiaSolicitacao.Path));

            noGuia.Tag = conteudoNoGuiaSolicitacao;

            noGuia.ImageIndex = 3;
            noGuia.SelectedImageIndex = 3;

            noGuia.ContextMenuStrip = GerarContextMenuStrip(TipoNo.GuiaSolicitacao, conteudoNoGuiaSolicitacao.NoTipoGuia.TipoGuia, false);

            noGuia.Nodes.Add("nodeFake");

            return noGuia;
        }

        private TreeNode[] CriarListaNoGuiaSolicitacao(ConteudoNoTipoGuia conteudoNoTipoGuia)
        {
            List<TreeNode> listaNoGuiaSolicitacao = new List<TreeNode>();

            GuiaSolicitacaoRepository repositorioGuiaSolicitacao = new GuiaSolicitacaoRepository(AddinUtils.Command);

            var colecaoGuias = from g in repositorioGuiaSolicitacao.GetAll()
                               where g.IDTipoGuia == (int)conteudoNoTipoGuia.TipoGuia &&
                                    g.IDOperadoraPrestador == conteudoNoTipoGuia.NoOperadora.IDOperadoraPrestador
                               select g;

            foreach (var guia in colecaoGuias)
            {
                listaNoGuiaSolicitacao.Add(CriarNoGuiaSolicitacao(new ConteudoNoGuia(conteudoNoTipoGuia.NoOperadora, conteudoNoTipoGuia, guia.NumeroGuia, guia.Local, guia.DataEmissao.ToString("dd/MM/yyyy"))));
            }

            return listaNoGuiaSolicitacao.ToArray();
        }

        public ContextMenuStrip GerarContextMenuStrip(TipoNo tipoNo, TipoGuia tipoGuia, bool? guiaGlosa)
        {
            ContextMenuStrip ctx = new ContextMenuStrip();

            switch (tipoNo)
            {
                case TipoNo.TipoGuia:
                    if ((int)tipoGuia < (int)TipoGuia.Solicitação_Internação)
                        ctx = this.cmsTipoGuia;
                    else
                        ctx = this.cmsTipoGuiaSolicitacao;
                    break;
                case TipoNo.Lote:
                    ctx = this.cmsLote;
                    break;
                case TipoNo.GuiaFaturamento:
                    if (guiaGlosa.HasValue)
                        if (guiaGlosa.Value)
                            ctx = this.cmsGuiaFaturamentoGlosa;
                        else
                            ctx = this.cmsGuiaFaturamento;
                    break;
                case TipoNo.GuiaExtensao:
                    break;
                case TipoNo.GuiaSolicitacao:
                    break;
            }

            return ctx;
        }
        #endregion
    }
}
